/* LimitExceededException.h
 * 
 *  Author          : Alexander J. Yee
 *  Date Created    : 04/09/2017
 *  Last Modified   : 04/09/2017
 * 
 */

#pragma once
#ifndef ymp_Exceptions_LimitExceededException_H
#define ymp_Exceptions_LimitExceededException_H
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//  Dependencies
#include <string>
#include "PublicLibs/CompilerSettings.h"
#include "PublicLibs/Types.h"
#include "StringException.h"
namespace ymp{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
class LimitExceededException : public StringException{
    YMP_EXCEPTION_DECLARATIONS()

public:
    LimitExceededException(uiL_t attempted);
    LimitExceededException(const char* function, uiL_t limit, uiL_t attempted);
    LimitExceededException(const char* function, std::string limit, std::string attempted);
    LimitExceededException(
        const char* function,
        std::string message,
        uiL_t limit, uiL_t attempted
    );
    LimitExceededException(
        const char* function,
        std::string message,
        std::string limit, std::string attempted
    );

    virtual void print() const override;

public:
    //  Serialization
    LimitExceededException(SerializationPassKey key, const char*& stream);
    virtual void serialize(std::string& stream) const override;

private:
    uiL_t m_limit;
    uiL_t m_attempted;
    std::string m_str_limit;
    std::string m_str_attempted;
};
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
}
#endif
